package Srevet_;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.net.Socket;
import java.security.Provider;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Collection;

public class ServerReader extends  Thread {
    private Socket socket;

    public ServerReader(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {


        try {
            //接受 消息  1 登录消息 包含名称 2群聊消息

            //所以客户端声明协议  先接受整数  在判断消息类型
            DataInputStream dis=new DataInputStream(socket.getInputStream());
            while (true) {
                int type=dis.readInt();
                switch (type) {
                    case 1:
                        //登录消息
                        String username=dis.readUTF();
                        System.out.println("用户"+username+"登录了");
                        //把用户加入在线列表
                        Srevet.onLineSockets.put(socket,username);
                        //更新客户端在线人
                       updataSocketOnLineUser();
                        break;
                    case 2:
                        //群聊消息
                        String message=dis.readUTF();
                        sendMsgToAll(message);
                        //把群聊消息发送给所有在线用户
                        break;
                }
            }


        } catch (Exception e) {
            System.out.println("用户"+Srevet.onLineSockets.get(socket)+"下线了");
            Srevet.onLineSockets.remove(socket);//移除下线的 用户
            updataSocketOnLineUser();//下线也会在线更新在线人数
        }

    }

    private void sendMsgToAll(String message) {
    //给全部在线socket 推送收到消息
        //一定拼装好消息再发送
        StringBuilder sb=new StringBuilder();
        String name= Srevet.onLineSockets.get(socket);
        //获取时间
        LocalDateTime now=LocalDateTime.now();
        String time= now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss EEE a"));
        String append = sb.append(name).append(" ").append(time).append("\r\n").append(message).append("\r\n").toString();

        for (Socket socket:Srevet.onLineSockets.keySet()) {
            try {
                DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
                dos.writeInt(2);
                dos.writeUTF(append.toString());
                dos.flush();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }


    }

    private void updataSocketOnLineUser() {
        //更新在线用户列表
         //1拿到全部在线用户   把名称转发给全部在线socket管道
        Collection<String> onLineUsers = Srevet.onLineSockets.values();
        for (Socket socket:Srevet.onLineSockets.keySet()) {
            try {
                //2拿到管道

                //3写出数据
                DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
                dos.writeInt(1);
                dos.writeInt(onLineUsers.size());
                for(String onLineUser:onLineUsers){
                    dos.writeUTF(onLineUser);
                }
                dos.flush();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }
}